---
title: 组合模式
description: Composite Pattern - 将对象组合成树形结构以表示"部分-整体"的层次结构
sidebar_position: 2
---

## 定义
组合模式最初只是用于解决树形结构的场景，更多的是处理对象组织结构之间的问题。而组合关系则是通过将不同对象起来完成一个功能。

组合模式（Composite Pattern）的定义是：将对象组合成树形结构以表示整个部分的层次结构，组合模式可以让用户统一对待单个对象和对象的组合。

比如：windows 操作系统中的目录结构，其实就是树形目录结构，通过

![](https://wkq-img.oss-cn-chengdu.aliyuncs.com/site/20250810221502.png)

**文件夹和文件的共性特征是都可以被放入文件夹，所以可以将文件夹和文件当成同一类对象去看待**。

组合模式可以让客户端统一单个对象（文件）和组合对象（文件夹）的逻辑处理（递归遍历），组合模式更像是一种数据结构和算法的抽象。
## 模式原理

组合模式中一共有三个角色：
* Component(抽象根节点): 定义了系统各层次之间共有的方法和属性（所有子类）。

* Composite(树枝节点)： 实现了根节点中定义的行为，其中有一个集合可以用于存储子节点。

* Leaf(叶子节点)： 叶子节点下没有其它分支，是系统层次遍历的最小单位。


## 应用实例

## 总结
### 优点
* 组合模式可以清楚地定义分层次的复杂对象，表示对象的全部或部分，它让客户端忽略了层次的差异，方便对整个层次结构进行控制。
* 客户端可以一致地使用一个组合结构或其中单个对象，不必关心处理的是单个对象还是整个组合结构，简化了客户端代码。
* 在组合模式中添加新的树枝节点和叶子节点都很方便，无需对现有类库进行任何修改，符合 “开闭原则“
* 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案，遇到叶子节点和树枝节点的递归组合，可以形成复杂的树形结构，但对树形结构的控制却非常简单。
### 缺点
使用组合模式的前提在于，业务场景必须能够表示成树形结构。所以，使用场景比较局限，并不是一种常用的设计模式。
### 适用场景
* 处理一个树形结构，比如，公司人员组织架构、订单信息等；
* 跨越多个层次结构聚合数据，比如，统计文件夹下文件总数。
* 统一处理一个结构中的多个对象，比如，遍历文件夹下所有 XML 类型文件内容。
